package com.example.boot6rabbitmqhigher.controller;


import com.example.boot6rabbitmqhigher.product.DefaultSender;
import com.example.boot6rabbitmqhigher.product.FanoutSender;
import com.example.boot6rabbitmqhigher.product.TopicSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 本工程是rabbit知识的实践
 *
 * 它涉及到  direct（直接）交换器，（路由键简单）
 * fanout（广播）交换器，(跟路由键没有关系)
 * topic交换器（复杂路由建）
 *
 * 为了保证消息的可靠性（应对消息丢失）的解决思路：
 * 对于生产者：
 *      发送方确认（对于信道channle ）
 *      失败通知(设置 mandatory 为 true，走回调，当然首先得配置号 )
 *  交换器持久化，队列持久化，消息持久化（当然这针对少数特殊业务） ，并非所有的业务都需要
 *  对于消费者：（拉取，推送）
 *      消息手动确认（消息不确认就会出现：消息重复）
 *      消息拒绝（nack/reject）（requeue=true 消息会重新投递，如为false 消息就会丢失）
 *      死信交换器(过期，拒绝，队列达到最大长度)
 *
 *     Request-Response 模式（同步）
 *     这种模式的特点如下：他们即是生产者，同样也是消费者
 *
 */
@RestController
public class RabbitController {

    @Autowired
    private DefaultSender defaultSender;
    @Autowired
    private TopicSender topicSender;
    @Autowired
    private FanoutSender fanoutSender;


    /**
     * 同一个项目中有生产者有消费者，加入消费者或者生产者只是为了验证rabbitmq的知识
     * 普通类型测试
     */
    @GetMapping("/hello")
    public void hello() {
        //mq的消息发送
        defaultSender.send("hello msg!");
    }

    /**
     * topic exchange类型rabbitmq测试
     */
    @GetMapping("/topicTest")
    public void topicTest() {
        topicSender.send();
    }

    /**
     * fanout exchange类型rabbitmq测试
     */
    @GetMapping("/fanoutTest")
    public void fanoutTest() {
        fanoutSender.send("hellomsg:OK");
    }
}
